package com.shujia.day12;


import java.io.*;
import java.util.Arrays;

public class Demo01IOReadImage {
    public static void main(String[] args) {
        /*
            IO流：
                input output 表示一个输入输出流：
                    流：数据像水流一样在我们构建的管道中进行流转
                    主要功能：
                        1.上传文件和下载文件
                        2.接收控制台的数据，将其转换成流，将数据转换成流输出到控制台
                        3.涉及到当前代码数据和其他设备以及代码之间的数据流转
                    Java对数据的操作是通过流的方式：
                    Java用于操作流的对象都在IO包中

            IO流的分类：
                按照数据流向
                    输入流	读入数据  => 从外部系统将数据读取到当前进程程序中
                    输出流	写出数据  => 将当前程序的内存数据写出到其他系统位置中
                按照数据类型
                    字节流  数据的存储形式是以字节的形式存储，类似于图片,视频,但是也包含一些文本信息(可以通过文本工具打开的文件)
                    字符流  数据的存储形式是以字符的形式存储，只包含文本信息的文件 只要字符流能读写的数据字节流也可以
                               在数据处理过程中，大部分的数据都是以字符的形式出现的，为了处理方便需要使用特定的流进行处理

            字节流的基类：
                输入流：InputStream
                输出流: OutputStream


         */
        // Stream:流  PrintStream=> 表示的是一个打印流，用于将数据输出到控制台
        PrintStream out1 = System.out;
        PrintStream out2 = System.err; // 开启了另外一个线程 专门用于打印错误日志的
        out1.println("正常输出到控制台");
        out2.println("将错误输出到控制台");


        /*
            TODO 构造字节输入流的实例对象
                FileNotFoundException 表示文件可能不存在的异常
               读取图片的操作
         */
        String path = "data/th.jpg";
        int capacityLen = 100;
        // 一般情况下，为了使用效率考虑，都会使用字节数组的方式读取数据
        byte[] bytes = new byte[capacityLen];  // 可以看成是一个瓢
        try {
            FileInputStream fileInputStream = new FileInputStream(path);
            try {
                // fileInputStream 可以用瓢在文件系统中 获取水流数据 返回的结果 readLength 表示每一次获得的数据长度
                int readLength = 0;
                while ((readLength = fileInputStream.read(bytes)) > 0) {
//                    System.out.println("获取的数据长度:"+readLength+"\t"+Arrays.toString(bytes));
                    // TODO 乱码了？ => 只有字符信息才能被转换成字符串，如果是字节数据图片，那么转换会乱码
//                    System.out.println(new String(bytes, 0, readLength));
                    if (readLength < capacityLen) {
                        System.out.println("获取的数据长度:"+readLength+"\t"+Arrays.toString(Arrays.copyOf(bytes, readLength)));
                    }else {
                        System.out.println("获取的数据长度:"+readLength+"\t"+Arrays.toString(bytes));
                    }

                }

            } catch (IOException e) {
                System.err.println("读数据异常....");
            }
        } catch (FileNotFoundException e) {
            System.err.println("您给定的文件路径不存在:" + path);
        }

    }
}
